package cn.itrip.auth.service.impl;


import cn.itrip.auth.service.MailService;
import cn.itrip.auth.service.SmsService;
import cn.itrip.auth.service.UserService;
import cn.itrip.beans.pojo.ItripUser;
import cn.itrip.common.MD5;
import cn.itrip.common.RedisAPI;
import cn.itrip.dao.user.ItripUserMapper;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class UserServiceImpl implements UserService {
    @Resource
    private ItripUserMapper itripUserMapper;
    @Resource
    private MailService mailService;
    @Resource
    private RedisAPI redisAPI;
    @Resource
    private SmsService smsService;


    @Override
    public void mailCreateUser(ItripUser user) throws Exception {
        //1.添加用户
        itripUserMapper.insertItripUser(user);
        //2.生产激活码
        String activationCode = MD5.getMd5(new Date().toLocaleString(), 32);
        //3.发送邮件
        mailService.sendActivationMail(user.getUserCode(), activationCode);
        //4.激活码存入Redis
        redisAPI.set("activation:" + user.getUserCode(), 30 * 60, activationCode);
    }

    @Override
    public boolean mailActivate(String mail, String activationCode) throws Exception {
        //1.验证激活码
        String code = redisAPI.get("activation:" + mail);
        if (code.equals(activationCode)) {
            Map<String, Object> userMap = new HashMap();
            userMap.put("userCode", mail);
            List<ItripUser> userList = itripUserMapper.getItripUserListByMap(userMap);
            if (userList.size() > 0) {
                ItripUser user = userList.get(0);
                //2.更新用户
                user.setActivated(1);
                user.setUserType(0);//自注册用户
                user.setFlatID(user.getId());
                itripUserMapper.updateItripUser(user);
                return true;
            }
        } else {
            return false;
        }
        return false;
    }

    @Override
    public ItripUser findUserByUserCode(String userCode) throws Exception {
        Map<String, Object> userMap = new HashMap();
        userMap.put("userCode", userCode);
        List<ItripUser> userList = itripUserMapper.getItripUserListByMap(userMap);
        if (userList.size() > 0) {
            return userList.get(0);
        } else {
            return null;
        }
    }

    @Override
    public void phoneCreateUser(ItripUser user) throws Exception {
        //1.创建用户
        itripUserMapper.insertItripUser(user);
        //2.生成验证码
        int randomCode = MD5.getRandomCode();
        //3.发送验证码
        smsService.send(user.getUserCode(), "1", new String[]{String.valueOf(randomCode), "1"});
        //4.激活码存入Redis
        redisAPI.set("activation:" + user.getUserCode(), 30 * 60, String.valueOf(randomCode));
    }

    @Override
    public boolean phoneValidate(String phoneNum, String code) throws Exception {
        //1.比较验证码
        String key = "activation:" + phoneNum;
        String value = redisAPI.get(key);
        if (null != value && value.equals(code)) {
            ItripUser user = this.findUserByUserCode(phoneNum);
            if (null != user) {
                //2.更新用户激活状态
                user.setActivated(1);
                user.setFlatID(user.getId());
                user.setUserType(0);
                itripUserMapper.updateItripUser(user);
                return true;
            }
        }
        return false;
    }

    @Override
    public ItripUser login(String userCode, String userPassword) throws Exception {
        ItripUser user = this.findUserByUserCode(userCode);
        if (null != user && user.getUserPassword().equals(userPassword)) {
            if (user.getActivated() != 1)
                throw new Exception("用户未激活");
            return user;

        } else
            return null;
    }
}
